home *** CD-ROM | disk | FTP | other *** search
- /**************************************************************************
- NETBOOT - BOOTP/TFTP Bootstrap Program
-
- Author: Martin Renters
- Date: Dec/93
-
- **************************************************************************/
-
- #if defined(__linux) || defined(__BCC__)
- #include "linuxdef.h"
- #else
- #include <sys/types.h>
- #include <a.out.h>
- #include <netdb.h>
- #include <sys/param.h>
- #include <sys/socket.h>
- #include <sys/mount.h>
- #include <net/if.h>
- #include <netinet/in.h>
- #include <nfs/nfsv2.h>
- #include <nfs/nfsdiskless.h>
- #include <machine/bootinfo.h>
- #include <machine/cpufunc.h>
- #endif
-
- #define ESC 0x1B
-
- #ifndef DEFAULT_BOOTFILE
- #define DEFAULT_BOOTFILE "/kernel"
- #endif
-
- #ifndef MAX_TFTP_RETRIES
- #define MAX_TFTP_RETRIES 20
- #endif
-
- #ifndef MAX_BOOTP_RETRIES
- #define MAX_BOOTP_RETRIES 20
- #endif
-
- #ifndef MAX_ARP_RETRIES
- #define MAX_ARP_RETRIES 20
- #endif
-
- #ifndef MAX_RPC_RETRIES
- #define MAX_RPC_RETRIES 20
- #endif
-
- #ifndef TIMEOUT /* Inter-packet retry in ticks 18/sec */
- #define TIMEOUT 180
- #endif
-
- #ifndef NULL
- #define NULL ((void *)0)
- #endif
-
- #define TRUE 1
- #define FALSE 0
-
- #define ETHER_ADDR_SIZE 6 /* Size of Ethernet address */
- #define ETHER_HDR_SIZE 14 /* Size of ethernet header */
- #define ETH_MIN_PACKET 64
- #define ETH_MAX_PACKET 1518
-
- #define VENDOR_NONE 0
- #define VENDOR_WD 1
- #define VENDOR_NOVELL 2
- #define VENDOR_3COM 3
- #define VENDOR_3C509 4
-
- #define FLAG_PIO 0x01
- #define FLAG_16BIT 0x02
- #define FLAG_790 0x04
-
- #define ARP_CLIENT 0
- #define ARP_SERVER 1
- #define ARP_GATEWAY 2
- #define ARP_NS 3
- #define ARP_ROOTSERVER 4
- #define ARP_SWAPSERVER 5
- #define MAX_ARP ARP_SWAPSERVER+1
-
- #define IP 0x0800
- #define ARP 0x0806
-
- #define BOOTP_SERVER 67
- #define BOOTP_CLIENT 68
- #define TFTP 69
- #define SUNRPC 111
-
- #define RPC_SOCKET 620 /* Arbitrary */
-
- #define IP_UDP 17
- #define IP_BROADCAST 0xFFFFFFFF
-
- #define ARP_REQUEST 1
- #define ARP_REPLY 2
-
- #define BOOTP_REQUEST 1
- #define BOOTP_REPLY 2
-
- #define TAG_LEN(p) (*((p)+1))
- #define RFC1048_COOKIE { 99, 130, 83, 99 }
- #define RFC1048_PAD 0
- #define RFC1048_NETMASK 1
- #define RFC1048_GATEWAY 3
- #define RFC1048_HOSTNAME 12
- #define RFC1048_END 255
- #define BOOTP_VENDOR_LEN 64
-
- #define TFTP_MAX_PACKET 512
-
- #define TFTP_RRQ 1
- #define TFTP_WRQ 2
- #define TFTP_DATA 3
- #define TFTP_ACK 4
- #define TFTP_ERROR 5
-
- #define TFTP_CODE_EOF 1
- #define TFTP_CODE_MORE 2
- #define TFTP_CODE_ERROR 3
- #define TFTP_CODE_BOOT 4
- #define TFTP_CODE_CFG 5
-
- #define PROG_PORTMAP 100000
- #define PROG_NFS 100003
- #define PROG_MOUNT 100005
-
- #define MSG_CALL 0
- #define MSG_REPLY 1
-
- #define PORTMAP_LOOKUP 3
-
- #define MOUNT_ADDENTRY 1
- #define MOUNT_UMNTALL 4
- #define NFS_LOOKUP 4
- #define NFS_READ 6
-
- #define NFS_READ_SIZE 1024
-
-
- #define AWAIT_ARP 0
- #define AWAIT_BOOTP 1
- #define AWAIT_TFTP 2
- #define AWAIT_RPC 3
-
- struct arptable_t {
- unsigned long ipaddr;
- unsigned char node[6];
- } arptable[MAX_ARP];
-
- struct arprequest {
- unsigned short hwtype;
- unsigned short protocol;
- char hwlen;
- char protolen;
- unsigned short opcode;
- char shwaddr[6];
- char sipaddr[4];
- char thwaddr[6];
- char tipaddr[4];
- };
-
- struct iphdr {
- char verhdrlen;
- char service;
- unsigned short len;
- unsigned short ident;
- unsigned short frags;
- char ttl;
- char protocol;
- unsigned short chksum;
- char src[4];
- char dest[4];
- };
-
- struct udphdr {
- unsigned short src;
- unsigned short dest;
- unsigned short len;
- unsigned short chksum;
- };
-
- struct bootp_t {
- struct iphdr ip;
- struct udphdr udp;
- char bp_op;
- char bp_htype;
- char bp_hlen;
- char bp_hops;
- unsigned long bp_xid;
- unsigned short bp_secs;
- unsigned short unused;
- char bp_ciaddr[4];
- char bp_yiaddr[4];
- char bp_siaddr[4];
- char bp_giaddr[4];
- char bp_hwaddr[16];
- char bp_sname[64];
- char bp_file[128];
- char bp_vend[BOOTP_VENDOR_LEN];
- };
-
- struct tftp_t {
- struct iphdr ip;
- struct udphdr udp;
- unsigned short opcode;
- union {
- char rrq[TFTP_MAX_PACKET];
- struct {
- unsigned short block;
- char download[TFTP_MAX_PACKET];
- } data;
- struct {
- unsigned short block;
- } ack;
- struct {
- unsigned short errcode;
- char errmsg[TFTP_MAX_PACKET];
- } err;
- } u;
- };
-
- struct rpc_t {
- struct iphdr ip;
- struct udphdr udp;
- union {
- char data[1400];
- struct {
- long id;
- long type;
- long rstatus;
- long verifier;
- long v2;
- long astatus;
- long data[1];
- } reply;
- } u;
- };
-
- #define TFTP_MIN_PACKET (sizeof(struct iphdr) + sizeof(struct udphdr) + 4)
-
- /***************************************************************************
- RPC Functions
- ***************************************************************************/
- #define PUTLONG(val) {\
- register int lval = val; \
- *(rpcptr++) = ((lval) >> 24); \
- *(rpcptr++) = ((lval) >> 16); \
- *(rpcptr++) = ((lval) >> 8); \
- *(rpcptr++) = (lval); \
- rpclen+=4; }
-
- /***************************************************************************
- External prototypes
- ***************************************************************************/
- /* main.c */
- extern void load P((void));
- extern int load_linux P((int root_mount_port,int swap_mount_port,
- int root_nfs_port,char *kernel_handle));
- extern int linux_tftp P((unsigned int block,unsigned char *data,int len));
- extern int tftp P((char *name));
- extern int bootp P((void));
- extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
- unsigned int destsock, int len, char *buf));
- extern int await_reply P((int type, int ival, char *ptr));
- extern void default_netmask P((void));
- extern void decode_rfc1048 P((unsigned char *));
- extern unsigned short ipchksum P((unsigned short *, int len));
- extern void convert_ipaddr P((char *, char *));
-
- /* bootmenu.c */
- extern int execute P((char *string));
- extern void bootmenu P((void));
-
- /* <board>.c */
- extern void eth_reset P((void));
- extern int eth_probe P((void));
- extern void eth_transmit P((char *d, unsigned int t, unsigned int s, char *p));
- extern int eth_poll P((void));
- extern void eth_pio_read P((unsigned int src, unsigned char *dst, unsigned int cnt));
- extern void eth_pio_write P((unsigned char *src, unsigned int dst, unsigned int cnt));
- extern void DELAY P((int));
-
- /* linuxloader.c */
- extern char *linux_add_cmdline P((char *string));
-
- /* rpc.c */
- extern int rpclookup P((int addr, int prog, int ver));
- extern int nfs_mount P((int server, int port, char *path, char *fh));
- extern int nfs_umountall P((int server, int port));
- extern int nfs_lookup P((int server, int port, char *fh, char *path, char *file_fh));
- extern int nfs_read P((int server, int port, char *fh, int offset, int len, char *buffer));
- extern void rpc_err P((struct rpc_t *rpc));
- extern void nfs_err P((int err));
-
- /* misc.c */
- extern void bcopy P((void *src, void *dst, int cnt));
- extern void bzero P((void *dst, int cnt));
- extern int bcompare P((void *src, void *dst, int cnt));
- extern char *substr P((char *a, char *b));
- extern int getdec P((char **));
- extern void twiddle P((void));
- extern void printf(); /* old style to avoid varargs */
- extern char *sprintf();
- extern int setip P((char *p, unsigned long *i));
- extern void gateA20 P((void));
-
- /* start*.S */
- extern int getchar P((void));
- extern void putchar P((int));
- extern int iskey P((void));
- extern unsigned short memsize P((void));
- extern void start_linux P((void));
- extern void xstart P((unsigned long, unsigned long, unsigned long));
- extern unsigned long currticks P((void));
- extern int setjmp P((void *jmpbuf));
- extern void longjmp P((void *jmpbuf, int where));
- extern void exit P((int status));
-
- /***************************************************************************
- External variables
- ***************************************************************************/
- /* main.c */
- extern char *kernel;
- extern char kernel_buf[];
- extern struct nfs_diskless nfsdiskless;
- extern int hostnamelen;
- extern unsigned long netmask;
- extern int jmp_bootmenu[10];
-
- /* <board>.h */
- extern char eth_driver[];
- extern char packet[];
- extern int packetlen;
- extern short aui;
-
- /* bootmenu.c */
-
- /* linuxloader.c */
- extern struct bootp_t bootp_reply;
-
- /* rpc.c */
- extern int rpc_id;
-
- /* created by linker */
- extern char _edata[], _end[];
-